package utils

import (
	"fmt"
	"lingc/models"
	"log"
	"os"

	"github.com/joho/godotenv"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
)

// InitDB 初始化数据库连接
func InitDB() *gorm.DB {
	// 加载 .env 文件
	err := godotenv.Load(".env")
	if err != nil {
		log.Fatalf("无法加载 .env 文件: %v", err)
	}

	// 从环境变量中读取数据库连接配置
	dbUser := os.Getenv("DB_USER")
	dbPassword := os.Getenv("DB_PASSWORD")
	dbHost := os.Getenv("DB_HOST")
	dbPort := os.Getenv("DB_PORT")
	dbName := os.Getenv("DB_NAME")
	dbCharset := os.Getenv("DB_CHARSET")
	dbMigrate := os.Getenv("DB_MIGRATE")

	// 打印环境变量的值，用于调试
	// log.Printf("DB_USER: %s", dbUser)
	// log.Printf("DB_PASSWORD: %s", dbPassword)
	// log.Printf("DB_HOST: %s", dbHost)
	// log.Printf("DB_PORT: %s", dbPort)
	// log.Printf("DB_NAME: %s", dbName)

	// 检查每个环境变量是否为空
	if dbUser == "" {
		log.Fatalf("环境变量 DB_USER 未设置")
	}
	if dbPassword == "" {
		log.Fatalf("环境变量 DB_PASSWORD 未设置")
	}
	if dbHost == "" {
		log.Fatalf("环境变量 DB_HOST 未设置")
	}
	if dbPort == "" {
		log.Fatalf("环境变量 DB_PORT 未设置")
	}
	if dbName == "" {
		log.Fatalf("环境变量 DB_NAME 未设置")
	}

	// 构建数据库连接字符串
	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=True&loc=Local", dbUser, dbPassword, dbHost, dbPort, dbName, dbCharset)

	// 连接数据库并配置连接池
	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
	if err != nil {
		log.Fatalf("无法连接到数据库: %v", err)
	}

	// 配置连接池
	sqlDB, err := db.DB()
	if err != nil {
		log.Fatalf("无法获取底层数据库连接: %v", err)
	}
	sqlDB.SetMaxIdleConns(10)  // 最大空闲连接数
	sqlDB.SetMaxOpenConns(100) // 最大打开连接数

	if dbMigrate == "true" {
		// 自动迁移模式
		log.Println("开始自动迁移") // 添加日志记录，确认自动迁移开始

		// 检查表是否存在并跳过已存在的表
		tablesToMigrate := []interface{}{
			&models.AuthGroup{},
			&models.AuthHandleLog{},
			&models.AuthRule{},
			&models.AuthUser{},
			&models.SysConfig{},
			&models.SysContent{},
			&models.Member{},
			&models.MemberLevel{},
			&models.SysBanner{},
			&models.SysLang{},
			&models.SysLangItem{},
			&models.SysLangDetail{},
			&models.ChatGroup{},
			&models.ChatGroupRelation{},
			&models.ChatHistory{},
			&models.ChatAutoReply{},
		}

		for _, table := range tablesToMigrate {
			tableNameMethod := table.(interface{ TableName() string })
			tableName := tableNameMethod.TableName()
			// Check if the table already exists
			log.Printf("迁移表 %s", tableName)
			if db.Migrator().HasTable(tableName) {
				log.Printf("表 %s 已存在", tableName)
				continue
			}
			// Perform migration
			if err := db.AutoMigrate(table); err != nil {
				log.Fatalf("迁移表 %s: %v", tableName, err)
			}
			log.Printf("迁移成功表 %s", tableName)
		}
	}

	log.Println("数据库连接成功")
	return db
}
